

package br.com.beautycenter.Relatorios;

import br.com.beautycenter.bean.Cliente;
import br.com.beautycenter.bean.Funcionario;
import br.com.beautycenter.bean.Sessao;
import br.com.beautycenter.hibernateUtil.EntityManagerUtil;
import java.net.URL;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;


public class ChamadaRelatorios {
    
    Connection con;
    ResultSet rs;
    PreparedStatement stm;
    
    
    public static final int METODO_CONTROLE_ATENDIMENTO = 0;
    public static final int METODO_ATENDIMENTO_POR_PERIODO = 1;
    
    public static final String CONTROLE_ATENDIMENTO = "ControleAtendimento.jasper";
    public static final String ATENDIMENTOS_RESUMIDO = "AtendimentosResumido.jasper";
    public static final String COMPROVANTE_PACOTE = "ComprovantePacote.jasper";
    public static final String FECHAMENTO_CAIXA = "FechamentoCaixa.jasper";
    
    public static final String  QUERY_CONTROLE_ATENDIMENTO = "SELECT f.* FROM SESSAO s "
            + "INNER JOIN FUNCIONARIO f ON s.ID_FUNCIONARIO = f.ID_PESSOA "
            + "GROUP BY f.ID_PESSOA";
    
    URL caminhoLogo = getClass().getResource("/br/com/beautycenter/img/Logo.jpg");
    URL caminho = null; //caminho do arquivo a ser chamado
    Map parametros = new HashMap(); //parâmetros para os relatorios
    

    public void chamarRelatorio(boolean beanDataSource){
        try {
            JasperReport jasper = (JasperReport) JRLoader.loadObject(caminho);
            JasperPrint print = null;
            if(beanDataSource){
                //JRBeanDataSource transforma uma coleção em dados para o relatório
                print = JasperFillManager.fillReport(jasper, parametros, new JRBeanCollectionDataSource(null)); 
            }else{
                //JRResultDataSource transforma o resultado de um query em dados para o relatorio
                print = JasperFillManager.fillReport(jasper, parametros,new JRResultSetDataSource(rs));
            }
            //monta o relatório com os dados do resultset e os parâmetros
            JasperViewer view = new JasperViewer(print, false);

            //exibe o relatório no visualizador do jasper
            view.setVisible(true);
            view.toFront();
        } catch (JRException ex) {
            System.out.println("Erro ao criar relatorio: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
    
    /**
     * Cria o relatório que representa os prints 004 e 005
     * @param data
     * @param observacoes
     * @param caminhoLogo 
     */
    public void controleAtendimento(
            Date data, String observacoes, 
            Double totalTroco, Double totalSessoes, Double totalRecebimentoExtra,
            Double totalRetiradas, Double totalDespesas, Double totalVendas){
        
        con = EntityManagerUtil.getConexao();
        
        try {
            
            //executa a query e insere o resultado no ResultSet rs
            stm = con.prepareStatement(QUERY_CONTROLE_ATENDIMENTO);
            rs = stm.executeQuery();
            
            //seta os parametros
            parametros = new HashMap();
            parametros.put("REPORT_CONNECTION", con);
            parametros.put("DATA", data);
            parametros.put("OBSERVACOES", observacoes);
            parametros.put("LOGO", caminhoLogo);
            parametros.put("TOTAL_TROCO", totalTroco);
            parametros.put("TOTAL_PLANILHA", totalSessoes);
            parametros.put("TOTAL_RECEBIMENTO_EXTRA", totalRecebimentoExtra);
            parametros.put("TOTAL_RETIRADAS", totalRetiradas);
            parametros.put("TOTAL_DESPESAS", totalDespesas); 
            parametros.put("TOTAL_VENDAS", totalVendas);
            
            caminho = getClass().getResource(CONTROLE_ATENDIMENTO);
            
            chamarRelatorio(false);
            
        } catch (SQLException ex) {
            System.out.println("erro ao criar statement");
        } finally {
            try {
                rs.close();
                stm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("erro: não fechou a conexão");
            }
        }
    }
    
    public void atendimentoPorPeriodo(
            Date inicio, Date fim, List<Sessao> listaSemana, List<Sessao> listaFeriado, List<Sessao> listaRecebimentos,
            int totalAtendimentos, double valorReceber, String observacao, Funcionario funcionario){
        
        parametros = new HashMap();
        parametros.put("DATA_INICIAL", inicio);
        parametros.put("DATA_FINAL", fim);
        parametros.put("LISTA_SEMANA", listaSemana);
        parametros.put("LISTA_FERIADO", listaFeriado);
        parametros.put("TOTAL_ATENDIMENTOS", totalAtendimentos);
        parametros.put("VALOR_RECEBER", valorReceber);
        parametros.put("OBSERVACOES", observacao);
        parametros.put("FUNCIONARIO", funcionario.getNome());
        parametros.put("LISTA_RECEBIMENTOS", listaRecebimentos);
        
        caminho = getClass().getResource(ATENDIMENTOS_RESUMIDO);
        
        chamarRelatorio(false);
    }
    
    /**
     * 
     * @param cliente
     * @param listaSessao
     * @param tipoPacote 
     */
    public void comprovantePacote(Cliente cliente, List<Sessao> listaSessao, String tipoPacote){
        parametros = new HashMap();
        parametros.put("LOGO", caminhoLogo);
        parametros.put("CLIENTE", cliente.getNome());
        parametros.put("TIPO_PACOTE", tipoPacote);
        parametros.put("LISTA_PACOTE", listaSessao);
        
        caminho = getClass().getResource(COMPROVANTE_PACOTE);
        
        chamarRelatorio(false);
    }
    
    public void fechamentoCaixa(Date data, 
           Double totalSuprimento, Double totalSangria, Double totalDespesas,
           Double totalVenda, Double totalPacote, Double totalRecebimentoExtra,
           Double totalCaixa
        ){
        
        parametros = new HashMap();
        parametros.put("LOGO", caminhoLogo);
        parametros.put("DATA", data);
        parametros.put("TOTAL_SUPRIMENTO", totalSuprimento);
        parametros.put("TOTAL_SANGRIA", totalSangria);
        parametros.put("TOTAL_DESPESAS", totalDespesas);
        parametros.put("TOTAL_VENDAS", totalVenda);
        parametros.put("TOTAL_PACOTES", totalPacote);
        parametros.put("TOTAL_RECEBIMENTOS_EXTRAS", totalRecebimentoExtra);
        parametros.put("TOTAL_CAIXA", totalCaixa);
        
        caminho = getClass().getResource(FECHAMENTO_CAIXA);
        
        chamarRelatorio(false);
    }
}